From 6eca65b888d8c1a4f583cc5d7ac876cb7ffca6dc Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:31:00 +0100 Subject: [PATCH] gui/macOS: Correctly release objects received via FileProviderUtils functions Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovideritemmetadata_mac.mm | 2 ++ src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm | 2 ++ src/gui/macOS/fileprovidersettingscontroller_mac.mm | 8 +++++++- src/gui/macOS/fileproviderutils.h | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gui/macOS/fileprovideritemmetadata_mac.mm b/src/gui/macOS/fileprovideritemmetadata_mac.mm index ec9667470..8ff39979f 100644 --- a/src/gui/macOS/fileprovideritemmetadata_mac.mm +++ b/src/gui/macOS/fileprovideritemmetadata_mac.mm @@ -147,6 +147,8 @@ QString FileProviderItemMetadata::getUserVisiblePath() const dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); + [manager release]; + return returnPath; } diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm index b2fe54011..cfa73a14a 100644 --- a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm @@ -59,6 +59,8 @@ void FileProviderMaterialisedItemsModel::evictItem(const QString &identifier, co }]; dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC)); + [manager release]; + if (successfullyDeleted == NO) { return; } diff --git a/src/gui/macOS/fileprovidersettingscontroller_mac.mm b/src/gui/macOS/fileprovidersettingscontroller_mac.mm index d1fd68e69..89e1b76e2 100644 --- a/src/gui/macOS/fileprovidersettingscontroller_mac.mm +++ b/src/gui/macOS/fileprovidersettingscontroller_mac.mm @@ -167,6 +167,7 @@ public: qCInfo(lcFileProviderSettingsController) << "Signalling file provider domain" << userIdAtHost; NSFileProviderDomain * const domain = FileProviderUtils::domainForIdentifier(userIdAtHost); NSFileProviderManager * const manager = [NSFileProviderManager managerForDomain:domain]; + [domain release]; [manager signalEnumeratorForContainerItemIdentifier:NSFileProviderRootContainerItemIdentifier completionHandler:^(NSError *const error) { if (error != nil) { @@ -186,6 +187,7 @@ public: } public slots: + // NOTE: This method will release the provided args so make sure to retain them beforehand void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const managerForDomain, NSFileProviderDomain * const domain) { @@ -228,6 +230,9 @@ public slots: [storageUseObserver release]; [enumerator release]; + + [managerForDomain release]; + [domain release]; }; [enumerator enumerateItemsForObserver:storageUseObserver startingAtPage:NSFileProviderInitialPageSortedByName]; } @@ -283,7 +288,8 @@ private: << ", returning early."; return; } - + [managerForDomain retain]; + [domain retain]; enumerateMaterialisedFilesForDomainManager(managerForDomain, domain); } }]; diff --git a/src/gui/macOS/fileproviderutils.h b/src/gui/macOS/fileproviderutils.h index 063be6d6d..8a710fccf 100644 --- a/src/gui/macOS/fileproviderutils.h +++ b/src/gui/macOS/fileproviderutils.h @@ -29,6 +29,10 @@ class QString; * * You should threfore try to avoid using this in C++ code wherever possible * and only use this in *_mac.mm implementation files. + * + * IMPORTANT: All Objective-C objects returned here need to be released! + * They have been internally retained due to the async nature of the + * FileProvider API. */ namespace OCC { -- 2.30.2